﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Happy.ExtentionMethods.Reflection
{
    /// <summary>
    /// 扩展<see cref="Type"/>。
    /// </summary>
    public static class TypeExtentions
    {
        /// <summary>
        /// 创建<typeparamref name="T"/>类型的实例。
        /// </summary>
        public static T CreateInstance<T>(this Type type, params object[] args)
        {
            type.MustNotNull("type");

            return (T)type.CreateInstance(args);
        }

        /// <summary>
        /// 创建<paramref name="type"/>类型的实例。
        /// </summary>
        public static object CreateInstance(this Type type, params object[] args)
        {
            type.MustNotNull("type");

            return Activator.CreateInstance(type, args);
        }

        /// <summary>
        /// 是否是具体类型，凡是能直接实例化的类型都是具体类型。
        /// </summary>
        public static bool IsConcreteType(this Type type)
        {
            type.MustNotNull("type");

            return
                    !type.IsGenericTypeDefinition
                    &&
                    !type.IsAbstract
                    &&
                    !type.IsInterface;
        }

        /// <summary>
        /// 在<paramref name="type"/>的接口定义中，是否拥有<paramref name="genericInterfaceTypeDefinition"/>指定的泛型接口类型定义 。
        /// </summary>
        public static bool HasGenericInterfaceTypeDefinition(this Type type, Type genericInterfaceTypeDefinition)
        {
            type.MustNotNull("type");

            foreach (var item in type.GetInterfaces())
            {
                if (item.IsGenericType
                    &&
                    item.GetGenericTypeDefinition() == genericInterfaceTypeDefinition)
                {
                    return true;
                }
            }

            return false;
        }
    }
}
